﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.SqlClient;

namespace SoftHotel.Models
{
    public class OrdenCompraDAO
    {
        Conexion conexionBD = new Conexion();
        static List<OrdenCompra> listaOC = new List<OrdenCompra>() { };
        public OrdenCompra ObtenerOCbyID(string id)
        {
            OrdenCompra oc = new OrdenCompra();
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select oc.idOrdenCompra,oc.numeroOC, p1.razonSocial,p2.nombre,oc.fechaEmision, oc.fechaEntrega,p3.valor,p4.valor " +
                           ",p5.valor ,p6.valor,oc.montoTotal from OrdenCompra oc, Proveedor p1 , Sede P2, Parametro p3, " +
                           " Parametro p4, Parametro p5, Parametro p6 where oc.idProveedor = p1.idProveedor and " +
                           "oc.idSede = p2.idSede and oc.moneda = p3.idParametro and oc.formaPago = p4.idParametro " +
                           " and oc.prioridad = p5.idParametro and oc.estado = p6.idParametro and " +
                           " idOrdenCompra = '" + id + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                oc.Id = dr[0].ToString();
                oc.NumeroOC = dr[1].ToString();
                oc.Proveedor = dr[2].ToString();
                oc.Sede = dr[3].ToString();
                oc.FechaEmision = String.Format("{0:d/M/yyyy }", dr[4].ToString());
                oc.FechaEntrega = String.Format("{0:d/M/yyyy }", dr[5].ToString());
                oc.Moneda = dr[6].ToString();
                oc.FormaPago = dr[7].ToString();
                oc.Prioridad = dr[8].ToString();
                oc.Estado = dr[9].ToString();
                oc.total = dr[10].ToString();
            }
            return oc;
        }
        public SelectListItem[] ObtenerHoteles()
        {
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select nombre from Sede";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }
        public SelectListItem[] ObtenerProveedores()
        {
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select razonSocial from Proveedor";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }
        public SelectListItem[] ObtenerTipos(string tipo)
        {
            //conexionBD.AbrirConexion();
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select valor from Parametro where tipo = '" + tipo + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }

        public SelectListItem[] ObtenerProductosXProveedor(string proveedor)
        {
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select p.descripcion, prov.razonSocial from producto p, ProductoXProveedor " +
                           "pxp,Proveedor prov where p.idProducto = pxp.idProducto and prov.idProveedor " +
                           "= pxp.idProveedor and prov.razonSocial = '" + proveedor + "' ";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }
        public SelectListItem[] ObtenerProductosXProveedor(OrdenCompra oc)
        {
            List<SelectListItem> ls = new List<SelectListItem>();
            string query = "select p.descripcion, prov.razonSocial from producto p, ProductoXProveedor " +
                           "pxp,Proveedor prov where p.idProducto = pxp.idProducto and prov.idProveedor " +
                           "= pxp.idProveedor and prov.razonSocial = (select prov.razonSocial from OrdenCompra  " +
                           " oc,Proveedor prov where prov.idProveedor = oc.idProveedor and  oc.idOrdenCompra = '" +
                           oc.Id + "') ";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                ls.Add(new SelectListItem { Value = dr[0].ToString(), Text = dr[0].ToString() });
            }
            SelectListItem[] sls = new SelectListItem[ls.Count];
            for (int i = 0; i < ls.Count; i++)
            {
                sls[i] = ls[i];
            }
            return sls;
        }

        public void Add(OrdenCompra oc)
        {
            ProductoModel p = new ProductoModel();
            p.descripcion = oc.nombreProducto;
            p.precio = oc.precioProducto;
            p.cantidad = oc.cantidadProducto;
            if (oc.total == null) oc.total = "0";
            p.total = (float.Parse(p.precio) * float.Parse(p.cantidad)).ToString();
            oc.total = (float.Parse(oc.total) + float.Parse(p.total)).ToString();
            oc.productos.Add(p);
        }

        public void Guardar(OrdenCompra ordenCompra)
        {
            string idProveedor = "";
            string idSede = "";
            string idEstado = "";
            string idMoneda = "";
            string idFormaPago = "";
            string idPrioridad = "";
            string query = "select idProveedor from Proveedor where razonSocial = '" + ordenCompra.Proveedor + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idProveedor = dr[0].ToString();
            dr.Close();
            query = "select idSede from Sede where nombre = '" + ordenCompra.Sede + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idSede = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'MONEDA_OC' and valor =  '" + ordenCompra.Moneda + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idMoneda = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'FORMA_PAGO_OC' and valor = '" + ordenCompra.FormaPago + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idFormaPago = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'PRIORIDAD_OC' and valor = '" + ordenCompra.Prioridad + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idPrioridad = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'ESTADO_OC' and valor = 'Por Aprobar'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idPrioridad = dr[0].ToString();
            dr.Close();
            float sumTotal= calcularTotal(ordenCompra);
            DateTime now1 = DateTime.Now;
            string now = String.Format("{0:d/M/yyyy HH:mm:ss}", now1);
            query = "insert into OrdenCompra (idProveedor,idSede,fechaEmision,fechaEntrega,moneda,formaPago,prioridad,estado,montoTotal) " +
                    "values ('" + idProveedor + "','" + idSede + "','" + now + "','" + ordenCompra.FechaEntrega +
                    "','" + idMoneda + "','" + idFormaPago + "','" + idPrioridad + "','"+ idEstado+ "','" + sumTotal + "')";
            conexionBD.EjecutarComando(query);

            foreach (var prod in ordenCompra.productos)
            {
                string idProducto = "";
                string idOrdenCompra = "";
                query = "select idProducto from Producto where descripcion = '" + prod.descripcion + "'";
                dr = conexionBD.EjecutarReader(query);
                if (dr != null && dr.Read())
                    idProducto = dr[0].ToString();
                dr.Close();
                query = "select TOP(1) idOrdenCompra from OrdenCompra order by idOrdenCompra desc";
                dr = conexionBD.EjecutarReader(query);
                if (dr != null && dr.Read())
                    idOrdenCompra = dr[0].ToString();
                dr.Close();

                query = "insert into ProductoXProveedorXOrdenCompra values ('" + idProducto + "','" + idProveedor + "','" + idOrdenCompra + "','" + prod.precio + "','" + prod.cantidad + "')";
                conexionBD.EjecutarComando(query);
            }
        }

        private float calcularTotal(OrdenCompra ordenCompra)
        {
            float sum = 0;
            foreach (var prod in ordenCompra.productos)
            {
                sum += float.Parse(prod.precio) * Int32.Parse(prod.cantidad);
            }
            return sum;
        }

        public List<ProductoModel> ObtenerProductosXOC(OrdenCompra oc)
        {
            List<ProductoModel> lis = new List<ProductoModel>();
            string query = "select ppoc.idProducto,p.descripcion,ppoc.precio, ppoc.moneda,ppoc.idOrdenCompra " +
                           " from ProductoXProveedorXOrdenCompra ppoc, pruebaSoftHotel.dbo.Producto p " +
                           " where ppoc.idProducto = p.idProducto and ppoc.idOrdenCompra = '" + oc.Id + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                lis.Add(new ProductoModel()
                {
                    idProducto = dr[0].ToString(),
                    descripcion = dr[1].ToString(),
                    precio = dr[2].ToString(),
                    cantidad = dr[3].ToString(),
                    total = (float.Parse(dr[2].ToString())*Int32.Parse(dr[3].ToString())).ToString()
                });
            }

            return lis;
        }

        internal void Actualizar(OrdenCompra ordenCompra)
        {
            string idProveedor = "";
            string idSede = "";
            string idMoneda = "";
            string idFormaPago = "";
            string idPrioridad = "";
            string idEstado = "";
            string query = "select idProveedor from Proveedor where razonSocial = '" + ordenCompra.Proveedor + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idProveedor = dr[0].ToString();
            dr.Close();
            query = "select idSede from Sede where nombre = '" + ordenCompra.Sede + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idSede = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'MONEDA_OC' and valor =  '" + ordenCompra.Moneda + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idMoneda = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'FORMA_PAGO_OC' and valor = '" + ordenCompra.FormaPago + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idFormaPago = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'PRIORIDAD_OC' and valor = '" + ordenCompra.Prioridad + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idPrioridad = dr[0].ToString();
            dr.Close();
            query = "select idParametro from Parametro where tipo = 'ESTADO_OC' and valor = '" + ordenCompra.Estado + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idEstado= dr[0].ToString();
            dr.Close();
            DateTime now1 = DateTime.Now;
            //float sumTotal = calcularTotal(ordenCompra);
            float sumTotal = 450;
            string now = String.Format("{0:d/M/yyyy HH:mm:ss}", now1);
            query = "Update  OrdenCompra set "+
                    "idProveedor = '" +idProveedor+ "',idSede = '"+idSede+"',fechaEntrega = '" +ordenCompra.FechaEntrega+ ",moneda ='"+idMoneda +
                     "',formaPago = '" +idFormaPago+ "',prioridad = '"+idPrioridad+"',estado= '"+idEstado+"',montoTotal = '"+ sumTotal+"') " +
                    " where idOrdenCompra = '" + ordenCompra.Id+"'";
            conexionBD.EjecutarComando(query);
        }

        public void ActualProd(OrdenCompra oc, string descripcion2)
        {
            int cantidad = 0; 
            float precio = 0;
            foreach (var prod in oc.productos)
            {
                if (prod.idProducto == descripcion2) { precio = float.Parse(prod.precio); cantidad = Int32.Parse(prod.cantidad); break;}
            }
            string query = "delete from ProductoXProveedorXOrdenCompra where idOrdenCompra = '" +oc.Id+"' and idProducto = '" +descripcion2+ "'";
            conexionBD.EjecutarComando(query);
            //oc.total = (float.Parse(oc.total) -  (cantidad * precio)).ToString();
        }

        public void InsertarProd(OrdenCompra oc)
        {
            string idProveedor = "";
            string idProducto = "";
            string query = "select idProveedor from Proveedor where razonSocial = '" + oc.Proveedor + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idProveedor = dr[0].ToString();
            dr.Close();
            query = "select idProducto from Producto where descripcion = '" + oc.nombreProducto + "'";
            dr = conexionBD.EjecutarReader(query);
            if (dr != null && dr.Read())
                idProducto = dr[0].ToString();
            dr.Close();
            query = "insert into ProductoXProveedorXOrdenCompra values ('" + idProducto + "','" + idProveedor + "','" + oc.Id + "','" + oc.precioProducto+ "','" + oc.cantidadProducto + "')";
            conexionBD.EjecutarComando(query);
            
        }

        internal List<ProductoModel> ObtenerProductosXDC(DocumentoCompra DC)
        {
            List<ProductoModel> lis = new List<ProductoModel>();
            string query = "select ppoc.idProducto,p.descripcion,ppoc.precio, ppoc.moneda,ppoc.idOrdenCompra " +
                           " from ProductoXProveedorXOrdenCompra ppoc, pruebaSoftHotel.dbo.Producto p " +
                           " where ppoc.idProducto = p.idProducto and ppoc.idOrdenCompra = '" + DC.idOC + "'";
            SqlDataReader dr = conexionBD.EjecutarReader(query);
            while (dr != null && dr.Read())
            {
                lis.Add(new ProductoModel()
                {
                    idProducto = dr[0].ToString(),
                    descripcion = dr[1].ToString(),
                    precio = dr[2].ToString(),
                    cantidad = dr[3].ToString(),
                    total = (float.Parse(dr[2].ToString()) * Int32.Parse(dr[3].ToString())).ToString()
                });
            }

            return lis;
        }
    }
}